/**
 * 简化版用户管理后端服务器
 * 
 * 这个版本不需要数据库，使用内存存储数据
 * 适合快速演示和开发测试
 * 
 * 功能特点：
 * 1. 无需安装数据库
 * 2. 数据存储在内存中（重启服务器会丢失）
 * 3. 提供完整的CRUD API接口
 * 4. 支持跨域请求
 */

import express from 'express'
import cors from 'cors'
import bodyParser from 'body-parser'

// 创建Express应用实例
const app = express()
const PORT = process.env.PORT || 3000

// 中间件配置
// 小白注释：CORS是跨域资源共享设置，允许不同端口的前端访问后端。
// 这里设置允许本地常用的两个端口：开发(5173) 和 预览(4173)
const allowedOrigins = ['http://localhost:5173', 'http://localhost:4173']
app.use(cors({
  origin: (origin, callback) => {
    // 说明：某些开发环境请求可能没有origin（比如curl），这种情况也允许
    if (!origin || allowedOrigins.includes(origin)) {
      callback(null, true)
    } else {
      callback(new Error('CORS不允许该来源：' + origin))
    }
  },
  credentials: true
}))
app.use(bodyParser.json())            // 解析JSON请求体
app.use(bodyParser.urlencoded({ extended: true }))

// 内存数据库 - 用户列表
// 什么是内存数据库？数据存储在服务器的内存中，重启会丢失
let users = [
  {
    id: 1,
    name: '张三',
    email: 'zhangsan@example.com',
    age: 25,
    phone: '13800138000',
    address: '北京市朝阳区',
    status: 'active',
    createdAt: new Date().toISOString()
  },
  {
    id: 2,
    name: '李四',
    email: 'lisi@example.com',
    age: 30,
    phone: '13900139000',
    address: '上海市浦东新区',
    status: 'active',
    createdAt: new Date().toISOString()
  },
  {
    id: 3,
    name: '王五',
    email: 'wangwu@example.com',
    age: 28,
    phone: '13700137000',
    address: '广州市天河区',
    status: 'inactive',
    createdAt: new Date().toISOString()
  }
]

// 自增ID计数器
let nextId = 4

/**
 * 用户管理API路由
 */

/**
 * 函数：获取用户列表（GET /api/users）
 * 作用：返回一个用户数组，支持“搜索、状态筛选、分页”。
 * 什么时候会被调用：前端页面加载时、或用户点击查询按钮时。
 * 输入（从地址栏的查询参数拿）：
 * - page：第几页，默认1；
 * - limit：每页多少条，默认10；
 * - search：模糊搜索关键字（按姓名或邮箱）；
 * - status：用户状态筛选（active/inactive）。
 * 输出：JSON对象，包含 users（当前页数据）和 pagination（分页信息）。
 * 失败时会返回：HTTP 500，包含错误信息。
 * 逻辑步骤（小白理解版）：
 * 1）读取查询参数；2）按关键字过滤；3）按状态过滤；4）计算分页范围；5）截取当前页数据并返回。
 */
// 获取用户列表
// GET /api/users
app.get('/api/users', (req, res) => {
  try {
    console.log('📋 获取用户列表')
    
    // 获取查询参数
    const { page = 1, limit = 10, search = '', status = '' } = req.query
    
    // 过滤用户数据
    let filteredUsers = users
    
    // 搜索功能
    if (search) {
      filteredUsers = filteredUsers.filter(user => 
        user.name.toLowerCase().includes(search.toLowerCase()) ||
        user.email.toLowerCase().includes(search.toLowerCase())
      )
    }
    
    // 状态筛选
    if (status) {
      filteredUsers = filteredUsers.filter(user => user.status === status)
    }
    
    // 分页计算
    const startIndex = (page - 1) * limit
    const endIndex = startIndex + parseInt(limit)
    const paginatedUsers = filteredUsers.slice(startIndex, endIndex)
    
    // 返回响应
    res.json({
      success: true,
      data: {
        users: paginatedUsers,
        pagination: {
          current: parseInt(page),
          pageSize: parseInt(limit),
          total: filteredUsers.length,
          totalPages: Math.ceil(filteredUsers.length / limit)
        }
      },
      message: '获取用户列表成功'
    })
    
  } catch (error) {
    console.error('❌ 获取用户列表失败：', error)
    res.status(500).json({
      success: false,
      message: '获取用户列表失败',
      error: error.message
    })
  }
})

/**
 * 函数：获取单个用户详情（GET /api/users/:id）
 * 作用：根据用户ID返回该用户的完整信息。
 * 什么时候会被调用：前端查看详情或编辑用户前。
 * 输入（从路径参数拿）：
 * - id：用户的唯一ID（数字）。
 * 输出：JSON对象，data为该用户；
 * 如果找不到：返回HTTP 404，提示“用户不存在”。
 * 逻辑步骤：1）把字符串ID转成数字；2）在内存数组里查找；3）找到了就返回，找不到就404。
 */
// 获取单个用户详情
// GET /api/users/:id
app.get('/api/users/:id', (req, res) => {
  try {
    const userId = parseInt(req.params.id)
    console.log(`🔍 获取用户详情 - ID：${userId}`)
    
    // 查找用户
    const user = users.find(u => u.id === userId)
    
    // 如果用户不存在
    if (!user) {
      return res.status(404).json({
        success: false,
        message: '用户不存在'
      })
    }
    
    // 返回用户详情
    res.json({
      success: true,
      data: user,
      message: '获取用户详情成功'
    })
    
  } catch (error) {
    console.error('❌ 获取用户详情失败：', error)
    res.status(500).json({
      success: false,
      message: '获取用户详情失败',
      error: error.message
    })
  }
})

/**
 * 函数：创建新用户（POST /api/users）
 * 作用：把前端提交的用户信息保存到内存“数据库”。
 * 什么时候会被调用：前端在“添加用户”弹窗里点击“确定”时。
 * 输入（请求体JSON）：至少包含 name（姓名）和 email（邮箱），可选 age、phone、address、status。
 * 输出：JSON对象，data为新创建的用户（带自增id和createdAt）。
 * 失败情况：
 * - 缺少必填项：返回HTTP 400；
 * - 邮箱重复：返回HTTP 409；
 * - 其他错误：返回HTTP 500。
 * 逻辑步骤：1）校验必填；2）检查邮箱是否已存在；3）生成新用户（自增ID、默认状态、创建时间）；4）push进数组；5）返回201。
 */
// 创建新用户
// POST /api/users
app.post('/api/users', (req, res) => {
  try {
    const userData = req.body
    console.log('➕ 创建新用户：', userData)
    
    // 数据验证
    if (!userData.name || !userData.email) {
      return res.status(400).json({
        success: false,
        message: '姓名和邮箱不能为空'
      })
    }
    
    // 检查邮箱是否已存在
    const existingUser = users.find(u => u.email === userData.email)
    if (existingUser) {
      return res.status(409).json({  // 409：冲突
        success: false,
        message: '邮箱已存在'
      })
    }
    
    // 创建新用户
    const newUser = {
      id: nextId++,  // 自增ID
      ...userData,
      status: userData.status || 'active',
      createdAt: new Date().toISOString()
    }
    
    // 添加到用户列表
    users.push(newUser)
    
    console.log('✅ 用户创建成功：', newUser.id)
    
    // 返回创建成功的响应（201：创建成功）
    res.status(201).json({
      success: true,
      data: newUser,
      message: '用户创建成功'
    })
    
  } catch (error) {
    console.error('❌ 创建用户失败：', error)
    res.status(500).json({
      success: false,
      message: '创建用户失败',
      error: error.message
    })
  }
})

/**
 * 函数：更新用户信息（PUT /api/users/:id）
 * 作用：根据ID修改用户的部分或全部字段。
 * 什么时候会被调用：前端在“编辑用户”弹窗里点击“保存”时。
 * 输入：路径参数 id；请求体为要更新的字段（例如 name、email、age 等）。
 * 输出：JSON对象，data为更新后的用户。
 * 失败情况：
 * - 用户不存在：HTTP 404；
 * - 邮箱改成已存在的邮箱：HTTP 409；
 * - 其他错误：HTTP 500。
 * 逻辑步骤：1）找到用户索引；2）如更新邮箱则检查冲突；3）用展开运算符合并旧数据和新数据；4）返回成功。
 */
// 更新用户信息
// PUT /api/users/:id
app.put('/api/users/:id', (req, res) => {
  try {
    const userId = parseInt(req.params.id)
    const updateData = req.body
    
    console.log(`✏️ 更新用户信息 - ID：${userId}，数据：`, updateData)
    
    // 查找用户
    const userIndex = users.findIndex(u => u.id === userId)
    if (userIndex === -1) {
      return res.status(404).json({
        success: false,
        message: '用户不存在'
      })
    }
    
    // 如果要更新邮箱，检查新邮箱是否已存在
    if (updateData.email && updateData.email !== users[userIndex].email) {
      const existingUser = users.find(u => u.email === updateData.email)
      if (existingUser) {
        return res.status(409).json({
          success: false,
          message: '新邮箱已存在'
        })
      }
    }
    
    // 更新用户数据
    users[userIndex] = {
      ...users[userIndex],
      ...updateData
    }
    
    console.log('✅ 用户更新成功：', userId)
    
    res.json({
      success: true,
      data: users[userIndex],
      message: '用户更新成功'
    })
    
  } catch (error) {
    console.error('❌ 更新用户失败：', error)
    res.status(500).json({
      success: false,
      message: '更新用户失败',
      error: error.message
    })
  }
})

/**
 * 函数：删除用户（DELETE /api/users/:id）
 * 作用：按ID从内存“数据库”里移除该用户。
 * 什么时候会被调用：前端在表格里点“删除”并确认时。
 * 输入：路径参数 id。
 * 输出：删除成功的提示。
 * 失败情况：用户不存在返回HTTP 404；其他错误返回HTTP 500。
 * 逻辑步骤：1）找到用户索引；2）用splice删除该位置；3）返回成功。
 */
// 删除用户
// DELETE /api/users/:id
app.delete('/api/users/:id', (req, res) => {
  try {
    const userId = parseInt(req.params.id)
    
    console.log(`🗑️ 删除用户 - ID：${userId}`)
    
    // 查找用户
    const userIndex = users.findIndex(u => u.id === userId)
    if (userIndex === -1) {
      return res.status(404).json({
        success: false,
        message: '用户不存在'
      })
    }
    
    // 删除用户
    users.splice(userIndex, 1)  // splice：从数组中删除元素
    
    console.log('✅ 用户删除成功：', userId)
    
    res.json({
      success: true,
      message: '用户删除成功'
    })
    
  } catch (error) {
    console.error('❌ 删除用户失败：', error)
    res.status(500).json({
      success: false,
      message: '删除用户失败',
      error: error.message
    })
  }
})

/**
 * 函数：健康检查（GET /api/health）
 * 作用：告诉外界“服务活着”，并给出当前时间和用户数量。
 * 什么时候会被调用：开发阶段用来确认服务是否正常运行，监控也会用。
 * 输入：无。
 * 输出：JSON对象，包含 success、message、timestamp、usersCount。
 */
// 健康检查接口
// GET /api/health
app.get('/api/health', (req, res) => {
  res.json({
    success: true,
    message: '服务器运行正常',
    timestamp: new Date().toISOString(),
    usersCount: users.length
  })
})

// 启动服务器
app.listen(PORT, () => {
  console.log(`🚀 服务器启动成功！`)
  console.log(`📡 服务端口：${PORT}`)
  console.log(`🔗 API地址：http://localhost:${PORT}/api`)
  console.log(`❤️  健康检查：http://localhost:${PORT}/api/health`)
  console.log(`📊 当前用户数：${users.length}`)
  console.log('')
  console.log('💡 提示：这是一个内存数据库演示版本')
  console.log('   重启服务器后，所有数据将会丢失')
  console.log('   如需持久化存储，请使用真实数据库')
})